package cn.csc.module.order.service.order;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.module.order.api.order.dto.OrderSimpleAmountInfoRespDTO;
import cn.csc.module.order.api.order.dto.OrderStatusRespDTO;
import cn.csc.module.order.controller.admin.order.vo.*;
import cn.csc.module.order.controller.app.dto.OrderCreateReqDTO;
import cn.csc.module.order.controller.app.order.vo.AppOrderCreateReqVO;
import cn.csc.module.order.controller.app.order.vo.AppOrderPageRespVO;
import cn.csc.module.order.controller.app.order.vo.AppOrderWithItemAndAddrRespVO;
import cn.csc.module.order.controller.app.vo.OrderRespVO;
import cn.csc.module.order.dal.dataobject.item.OrderItemDO;
import cn.csc.module.order.dal.dataobject.order.OrderDO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;

import javax.validation.Valid;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 订单信息 Service 接口
 *
 * @author liuchuang
 */
public interface OrderService extends IService<OrderDO> {

    /**
     * 创建订单信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    BigInteger create(@Valid OrderCreateReqVO createReqVO);

    /**
     * 更新订单信息
     *
     * @param updateReqVO 更新信息
     */
    void update(@Valid OrderUpdateReqVO updateReqVO);

    /**
     * 支付时更新订单状态
     * @param orderIds 订单id列表
     * @return
     */
    Integer updateOrderState(List<BigInteger> orderIds, Integer orderStatus);

    /**
     * 删除订单信息
     *
     * @param id 编号
     */
    void delete(BigInteger id);

    /**
     * 获得订单信息
     *
     * @param id 编号
     * @return 订单信息
     */
    OrderDO get(BigInteger id);

    /**
     * 查询订单状态
     * @param orderIds 多个订单的订单id
     * @return 订单状态列表
     */
    List<OrderStatusRespDTO> getOrdersStatus(List<BigInteger> orderIds);

    /**
     * 获取订单中的金额信息，不包含退款
     * @param orderIds 多个订单的订单id
     * @return 订单商家id列表
     */
    List<OrderSimpleAmountInfoRespDTO> getOrdersSimpleAmountInfo(List<BigInteger> orderIds);

    /**
     * 取消订单
     * @param orderId 订单id
     */
    void cancelOrderAndGetCancelOrderIds(List<BigInteger> orderId);

    /**
     * 获得订单信息列表
     *
     * @param ids 编号
     * @return 订单信息列表
     */
    List<OrderDO> getList(Collection<BigInteger> ids);

    /**
     * 获得订单信息分页
     *
     * @param pageReqVO 分页查询
     * @return 订单信息分页
     */
    PageResult<OrderRespAdminVO> getPage(OrderPageReqVO pageReqVO);

    /**
     * 获得订单信息分页,包含订单子项
     *
     * @param pageReqVO 分页查询
     * @return 订单信息分页
     */
    PageResult<OrderWithItemRespVO> selectOrderWithItemsPage(OrderPageReqVO pageReqVO);

    /**
     *
     * @param pageReqVO 分页查询
     * @return
     */
    PageInfo<AppOrderWithItemAndAddrRespVO> selectOrderWithItemsAndAddrsPage(OrderPageReqVO pageReqVO);

    PageResult<OrderWithItemAndAddrRespVO> selectOrderWithItemAndAddrPage(OrderPageReqVO pageReqVO);

    /**
     * 查询订单信息，包含订单子项
     * @param merchantOrderId 商户订单ID
     * @return
     */
    OrderWithItemRespVO selectOrderWithItems(String merchantOrderId);

    /**
     * 获得订单信息列表, 用于 Excel 导出
     *
     * @param pageVO 查询条件
     * @return 订单信息列表
     */
    List<OrderDO> getExportList(OrderPageReqVO pageVO);

    /**
     * 保存订单订单项-app
     * @param orderDTO
     * @return
     */
    BigInteger saveOrder(OrderCreateReqDTO orderDTO);
    /**
     * 保存订单订单项-app
     * @param orderDTO
     * @return
     */
    BigInteger submitOrder(OrderCreateReqDTO orderDTO);
    /**
     * 根据订单id
     * @param orderId
     * @param
     * @return
     */
    OrderDO getOrderByOrderId(BigInteger orderId);

    /**
     * 确认收货/发货
     * @param orderDO
     * @return
     */
    Integer updateOrderStatus(OrderDO orderDO);

    /**
     * 将订单改为已支付状态
     * @param merchantOrderId 商户订单编号
     */
    Integer updateByToPaySuccess(String merchantOrderId);

    /**
     * 获得买家订单信息分页-小程序
     *
     * @param pageReqVO 分页查询
     * @return 订单信息分页
     */
    PageResult<OrderRespVO> getMiniPage(OrderPageReqVO pageReqVO);

    /**
     * 查询系统自动收货的订单
     *
     * @param orderReqVO
     * @return 订单信息列表
     */
    List<OrderDO> getListByDeliveryTime(OrderReqVO orderReqVO);

    /**
     * 获得订单状态下的数量信息
     *
     * @param orderStatus 订单状态
     * @return 订单信息
     */
    Long getCountByStatus(int orderStatus,BigInteger shopId);

    /**
     * 通过店铺ID列表获取店铺的订单数
     * @param list 店铺ID列表
     * @return
     */
    Map<String,Object> selectCountByShopIds(List<BigInteger> list);

    /**
     * 修改订单的支付订单号
     * @param orderDO
     * @return
     */
    Integer updateOrderNo(OrderDO orderDO);

    /**
     * 保存订单订单项-多sku-appV2
     * @param reqVO
     * @return
     */
    BigInteger saveOrderV2(AppOrderCreateReqVO reqVO);
    /**
     * 确认提交订单订单项-多sku-appV2
     * @param reqVO
     * @return
     */
    BigInteger  submitOrderV2(AppOrderCreateReqVO reqVO);
    /**
     * 获得买家订单信息分页-小程序V2
     *
     * @param pageReqVO 分页查询
     * @return 订单信息分页
     */
    PageResult<AppOrderPageRespVO> getMiniPageV2(OrderPageReqVO pageReqVO);

    /**
     * 确认收货/V2
     * @param orderIds
     * @return
     */
    void updateOrderStatusV2(List<BigInteger> orderIds);

    /**
     * 根据支付流水查询，订单Id的集合
     * @param outTradeNos
     * @return
     */
    List<OrderDO> selectToPaySuccess(List<BigInteger> outTradeNos);

    /**
     * 自动收货
     * @param list 订单子项List
     * @return
     */
    int autoReceive(List<OrderItemDO> list);

}
